package com.jvm.learn.oomtest;

/**
 * 栈溢出
 * 栈[线程私有的]，生命周期与线程相同；
 * 启动一个线程，会分配一个与该线程对应的栈；当线程调用一个方法时，就会创建一个栈帧（用于存储局部变量表、操作栈、动态链接、方法出口等信息），并将该栈帧压入线程所在的栈中。
 * eg：一个线程调用方法a()[产生栈帧f1，压入栈]，方法a()中调用方法b()[产生栈帧f2，压入栈中];执行完毕后，先弹出f2，再弹出f1，先进后出原则。
 * VM args：-Xss128k
 * @author eg366
 */
public class JVMStackSOF {

	private int stackLenth = 1;

	private void stackLeak() {
		stackLenth++;
		/* 递归调用同一个方法，产生栈帧 */
		stackLeak();
	}

	public static void main(String[] args) throws Throwable {
		JVMStackSOF oom = new JVMStackSOF();
		try {
			oom.stackLeak();
		} catch (Throwable e) {
			System.out.println("Stack length :" + oom.stackLenth);
			throw e;
		}
	}
}
